/**
 * @file spi.h
 * @author lc (lastone6210@gmail.com)
 * @brief
 * 引脚 PA5 - SPI1_SCK
 * 引脚 PA7 - SPI1_MOSI
 * 引脚 PA6 - SPI1_MISO
 * 引脚 PC0 - NSS
 * W25Q64BV: 
 * 存储划分: 
 *  128block, 每个block64KB
 *  每个block分16sector, 每个sector 4kB
 *  每个sector分16个page, 每个page 256B
 * FLASH的操作特性:
 *  FLASH只能按最低为Page进行操作
 *  读取的时候内部会使用缓冲
 *  写入的时候只能先擦除, 再按page或者sector写入
 * @version 0.1
 * @date 2025-09-06
 *
 * @copyright MIT 2025
 *
 */

 #ifndef _SPI_H_
 #define _SPI_H_
 
 // -----------头文件---------------
 #include "stm32f10x.h"
 #include "stm32f10x_spi.h"
 #include "stm32f10x_gpio.h"
 
 // -----------SPI相关操作-函数声明--------
 /**
  * @brief 将SPI初始化, 
  * 用于与W25Q64芯片通信
  * 
  */
 void mySPI_Init(void);
 
 /**
  * @brief 将发送和接收封装为一个函数
  * 
  * @param sendData 待发送的数据
  * @param recvData 待接收的数据缓冲区
  * @return uint32_t 0表示成功, 非0表示失败
  */
 uint32_t mySPI_SendRecv(uint8_t sendData, uint8_t *recvData);
 
 // -----------FLASH相关操作-函数声明--------
// 允许写入
void SPIFLASH_WriteEnable(void);
// 读取状态值, 判断是否可继续操作
void SPIFLASH_WaitForWriteDone(void);
// 获取设备ID
uint32_t SPIFLASH_GetID(void);
// 擦除某个地址对应的sector扇区
void SPIFLASH_SectorErase(uint32_t sctAddr);
// 按页写, 参数1为页地址 
void SPIFLASH_PageWrite(uint32_t dataAddr, uint8_t *data, uint32_t dataLen);
// 连续读, 从某个起始地址读取连续数据
void SPIFLASH_SequenceRead(uint32_t dataAddr, uint8_t *data, uint8_t dataLen);
 
#endif
